package com.thinkgsp.jxc.service;

import java.util.List;

import com.thinkgsp.jxc.model.Inventory;
import com.thinkgsp.jxc.model.InventoryAdd;
import com.thinkgsp.jxc.model.Product;
import com.thinkgsp.jxc.model.ProductBatchNo;
import com.thinkgsp.jxc.persistence.InventoryMapper;
import com.thinkgsp.jxc.persistence.mybatis.PagingResult;

/**
 * 产品库存业务类
 * @author evan
 *
 */
public interface InventoryService extends GeneralService {

	/**
	 * 设置库存持久化对象,本方法用于测试目的
	 * @param invMapper
	 */
	public void setInventoryMapper(InventoryMapper invMapper);
	
	/**
	 * 根据库存ID获取产品库存
	 * @param InvId
	 * @return
	 */
	public Inventory getInventory(Long invId);
	
	/**
	 * 获取库存列表
	 * @param year  年份
	 * @param period 期间
	 * @param invAddId 存货地址ID
	 * @return
	 */	
	//public List<Inventory> getInventoryList(Integer year,Integer period,Integer invAddId);
	public List<Inventory> getInventoryList(Integer year,Integer period);
	
	/**
	 * 获取库存列表(分页)
	 * @param year  年份
	 * @param period 期间
	 * @param invAddId 存货地址ID
	 * @return
	 */	
	public PagingResult<Inventory> getInventoryList(Integer year,Integer period,int start,int size);
	
	/**
	 * 根据类别Id查询产品库存
	 * @param year
	 * @param period
	 * @param invAddId
	 * @param classifyId
	 * @return
	 */
	//public List<Inventory> getInventoryList(Integer year,Integer period,Integer invAddId,Integer classifyId);
	public List<Inventory> getInventoryList(Integer year,Integer period,Integer classifyId);
	
	/**
	 * 根据类别Id查询产品库存
	 * @param year
	 * @param period
	 * @param invAddId
	 * @param classifyId
	 * @return
	 */
	public PagingResult<Inventory> getInventoryList(Integer year,Integer period,Integer classifyId,int start,int size);
	/**
	 * 查询某一库房的所有产品库存
	 * @param year
	 * @param period
	 * @param invaddId
	 * @return
	 */
	public List<Inventory> getInventoryListByInvAdd(Integer year,Integer period,Integer invaddId);
	
	/**
	 * 查询某一库房的所有产品库存(分页)
	 * @param year
	 * @param period
	 * @param invaddId
	 * @return
	 */
	public PagingResult<Inventory> getInventoryListByInvAdd(Integer year,Integer period,Integer invaddId,int start,int size);
	/**
	 * 查询产品库存
	 * @param year 年份
	 * @param period 期间
	 * @param productId 产品Id
	 * @param invAddId 存货地址Id
	 * @param batchNoId 批号Id
	 * @return
	 */
	public Inventory findInventory(Integer year,Integer period,Integer productId,Integer invAddId,Long batchNoId);
	
	/**
	 * 搜索产品库存
	 * @param year 年份
	 * @param period 期间
	 * @param invAddId 存货地址Id
	 * @param val 产品搜索值 
	 * @see com.thinkgsp.jxc.Product#searchProduct(String)
	 * @return
	 */	
	//public List<Inventory> searchInventory(Integer year,Integer period,Integer invAddId,String val);
	public List<Inventory> searchInventory(Integer year,Integer period,Integer invAddId,String val);
	
	/**
	 * 搜索产品库存(分页)
	 * @param year 年份
	 * @param period 期间
	 * @param invAddId 存货地址Id
	 * @param val 产品搜索值 
	 * @see com.thinkgsp.jxc.Product#searchProduct(String)
	 * @return
	 */	
	public PagingResult<Inventory> searchInventory(Integer year,Integer period,Integer invAddId,String val,int start,int size);
	
	/**
	 * 搜索产品库存
	 * @param year 年份
	 * @param period 期间
	 * @param val 产品搜索值 
	 * @see com.thinkgsp.jxc.Product#searchProduct(String)
	 * @return
	 */	
	public List<Inventory> searchInventory(Integer year,Integer period,String val);
	
	/**
	 * 搜索产品库存(分页)
	 * @param year 年份
	 * @param period 期间
	 * @param val 产品搜索值 
	 * @see com.thinkgsp.jxc.Product#searchProduct(String)
	 * @return
	 */	
	public PagingResult<Inventory> searchInventory(Integer year,Integer period,String val,int start,int size);
	
	/**
	 * 初始化产品库存
	 * @param productId
	 * @param batchNoId
	 * @return
	 */
	public Inventory InitProductInventory(Product product,ProductBatchNo batchNo,InventoryAdd invAdd) throws ServiceException;
	
	/**
	 * 删除产品库存,该商品的期初库存、期初余额、入库数量、入库金额、出库数量、出库金额必须为零才能删除。
	 * 否则删除不成功。
	 * @param invId
	 */
	public void deleteInventory(Long invId) throws ServiceException;
	
	/**
	 * 更新产品成本价,如果该商品库存为零，则成本价为零
	 * @param invId 库存Id
	 */
	public void updateCostPrice(Long invId);	
	
	/**
	 * 更新存货状态
	 * @param invid 库存Id
	 * @param state 库存状态 : 0 正常; 1 停止发货
	 */
	public void updateState(Long invId,Integer state);
	
	/**
	 * 期末结转
	 * @param curYear 当前年份
	 * @param curPeriod 当前期间
	 * @param nextYear 下一期年份
	 * @param nextPeriod 下一期期间
	 */
	public void periodEndForward(Integer curYear,Integer curPeriod,Integer nextYear,Integer nextPeriod);
	
}
